#ifndef __DALELIB_M2_H__
#define __DALELIB_M2_H__

#include <math.h>
#include <dalelib/maths/v2.h>

namespace dalelib
{

class m2
{
private:

	float f[4];

public:

	m2() { }
	m2(const float _Value00,const float _Value10,const float _Value01,const float _Value11)
	{
		f[0] = _Value00;
		f[1] = _Value10;
		f[2] = _Value01;
		f[3] = _Value11;
	}

	static const m2 zero;
	static const m2 identity;


	v2 operator*(const v2 _Value) const
	{
		return v2(
			_Value[0]*f[0] + _Value[1]*f[1],
			_Value[0]*f[2] + _Value[1]*f[3]
		);
	}

	static m2 rotation(const float _Angle)
	{
		float sa = sinf(_Angle), ca = cosf(_Angle);
		return m2(ca,-sa,sa,ca);
	}

	const float& operator[](const int _Index) const { return f[_Index]; }
	      float& operator[](const int _Index)       { return f[_Index]; }

	void print(const std::string _Str="") const;
	void print(const std::string _Str="");

};

} // namespace dalelib

#endif
